home *** CD-ROM | disk | FTP | other *** search
/ Network PC / Network PC.iso / amiga utilities / communication / bbs / termv4.6 / extras / source / term-source.lha / Colour.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-18  |  6.4 KB  |  303 lines

  1. /*
  2. **    Colour.c
  3. **
  4. **    Colour table support code
  5. **
  6. **    Copyright © 1990-1996 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. **
  9. **    :ts=4
  10. */
  11.  
  12. #ifndef _GLOBAL_H
  13. #include "Global.h"
  14. #endif
  15.  
  16.     /* ColourTablex12(const ColourTable *Table,UWORD *Dest12,LONG NumColours):
  17.      *
  18.      *    Convert colour table into 12 bit precision colours.
  19.      */
  20.  
  21. STATIC VOID
  22. ColourTablex12(const ColourTable *Table,UWORD *Dest12,LONG NumColours)
  23. {
  24.     LONG i;
  25.  
  26.     for(i = 0 ; i < NumColours ; i++)
  27.         Colour96x12(&Table->Entry[i].Red,&Dest12[i],1);
  28. }
  29.  
  30.     /* Colour96xColourTable(const ULONG *Source96,ColourTable *Table,LONG NumColours):
  31.      *
  32.      *    Convert 96 bit precision colours for colour table.
  33.      */
  34.  
  35. VOID
  36. Colour96xColourTable(const ULONG *Source96,ColourTable *Table,LONG NumColours)
  37. {
  38.     LONG i;
  39.  
  40.     for(i = 0 ; i < NumColours ; i++)
  41.     {
  42.         Table -> Entry[i] . Red        = *Source96++;
  43.         Table -> Entry[i] . Green    = *Source96++;
  44.         Table -> Entry[i] . Blue    = *Source96++;
  45.     }
  46. }
  47.  
  48.     /* Colour12xColourTable(const UWORD *Source12,ColourTable *Table,LONG NumColours):
  49.      *
  50.      *    Convert 12 bit precision colours for colour table.
  51.      */
  52.  
  53. VOID
  54. Colour12xColourTable(const UWORD *Source12,ColourTable *Table,LONG NumColours)
  55. {
  56.     LONG i;
  57.  
  58.     for(i = 0 ; i < NumColours ; i++)
  59.         Colour12x96(&Source12[i],&Table->Entry[i].Red,1);
  60. }
  61.  
  62.     /* Colour12x96(const UWORD *Source12,ULONG *Dest96,LONG NumColours):
  63.      *
  64.      *    Convert 12 bit precision colours into 96 bit colours.
  65.      */
  66.  
  67. VOID
  68. Colour12x96(const UWORD *Source12,ULONG *Dest96,LONG NumColours)
  69. {
  70.     ULONG r,g,b;
  71.     LONG v;
  72.  
  73.     do
  74.     {
  75.         v = *Source12++;
  76.  
  77.         r = (v & 0xF00) >> 8;
  78.         g = (v & 0x0F0) >> 4;
  79.         b = (v & 0x00F);
  80.  
  81.         *Dest96++ = SPREAD((r << 4) | r);
  82.         *Dest96++ = SPREAD((g << 4) | g);
  83.         *Dest96++ = SPREAD((b << 4) | b);
  84.     }
  85.     while(--NumColours);
  86. }
  87.  
  88.     /* Colour96x12(const UWORD *Source12,ULONG *Dest96,LONG NumColours):
  89.      *
  90.      *    Convert 96 bit precision colours into 12 bit colours.
  91.      */
  92.  
  93. VOID
  94. Colour96x12(const ULONG *Source96,UWORD *Dest12,LONG NumColours)
  95. {
  96.     ULONG r,g,b;
  97.  
  98.     do
  99.     {
  100.         r = (*Source96++) >> 28;
  101.         g = (*Source96++) >> 28;
  102.         b = (*Source96++) >> 28;
  103.  
  104.         *Dest12++ = (r << 8) | (g << 4) | b;
  105.     }
  106.     while(--NumColours);
  107. }
  108.  
  109.     /* CopyColourEntry(const ColourTable *Source,ColourTable *Destination,LONG From,LONG To):
  110.      *
  111.      *    Copy one colour register from one place to another.
  112.      */
  113.  
  114. VOID
  115. CopyColourEntry(const ColourTable *Source,ColourTable *Destination,LONG From,LONG To)
  116. {
  117.     if(From >= 0 && To >= 0 && From < Source -> NumColours && To < Destination -> NumColours)
  118.     {
  119.         Destination -> Entry[To] . Red        = Source -> Entry[From] . Red;
  120.         Destination -> Entry[To] . Green    = Source -> Entry[From] . Green;
  121.         Destination -> Entry[To] . Blue        = Source -> Entry[From] . Blue;
  122.     }
  123. }
  124.  
  125.     /* ColourTablex96(const ColourTable *Table,ULONG *Dest96):
  126.      *
  127.      *    Convert colour table to 96 bit RGB palette.
  128.      */
  129.  
  130. VOID
  131. ColourTablex96(const ColourTable *Table,ULONG *Dest96)
  132. {
  133.     LONG i;
  134.  
  135.     for(i = 0 ; i < Table -> NumColours ; i++)
  136.     {
  137.         *Dest96++ = Table -> Entry[i] . Red;
  138.         *Dest96++ = Table -> Entry[i] . Green;
  139.         *Dest96++ = Table -> Entry[i] . Blue;
  140.     }
  141. }
  142.  
  143.     /* DeleteColourTable(ColourTable *Table):
  144.      *
  145.      *    Delete a colour table.
  146.      */
  147.  
  148. VOID
  149. DeleteColourTable(ColourTable *Table)
  150. {
  151.     FreeVecPooled(Table);
  152. }
  153.  
  154.     /* CreateColourTable(LONG NumEntries,UWORD *Source12,ULONG *Source96):
  155.      *
  156.      *    Create a colour table and fill it with given data.
  157.      */
  158.  
  159. ColourTable *
  160. CreateColourTable(LONG NumEntries,const UWORD *Source12,const ULONG *Source96)
  161. {
  162.     ColourTable *Record;
  163.  
  164.     if(Record = (ColourTable *)AllocVecPooled(sizeof(ColourTable) + NumEntries * sizeof(ColourEntry),MEMF_ANY | MEMF_CLEAR))
  165.     {
  166.         LONG i;
  167.  
  168.         Record -> NumColours = NumEntries;
  169.  
  170.         for(i = 0 ; i < NumEntries ; i++)
  171.         {
  172.             Record -> Entry[i] . One    = 1;
  173.             Record -> Entry[i] . Which    = i;
  174.         }
  175.  
  176.         Record -> Entry[NumEntries] . One = 0;
  177.  
  178.         if(Source12)
  179.             Colour12xColourTable(Source12,Record,NumEntries);
  180.  
  181.         if(Source96)
  182.             Colour96xColourTable(Source96,Record,NumEntries);
  183.     }
  184.  
  185.     return(Record);
  186. }
  187.  
  188.     /* LoadColours(struct ViewPort *VPort,const ColourTable *Table,const UWORD *Colour12,LONG NumColours):
  189.      *
  190.      *    Load a colour table.
  191.      */
  192.  
  193. VOID
  194. LoadColourTable(struct ViewPort *VPort,const ColourTable *Table,const UWORD *Colour12,LONG NumColours)
  195. {
  196.     if(GfxBase -> LibNode . lib_Version >= 39 && Table)
  197.         LoadRGB32(VPort,(ULONG *)Table -> Entry);
  198.     else
  199.     {
  200.         if(Colour12)
  201.             LoadRGB4(VPort,(UWORD *)Colour12,NumColours);
  202.         else
  203.         {
  204.             if(Table)
  205.             {
  206.                 UWORD *Dest12;
  207.  
  208.                 if(Dest12 = (UWORD *)AllocVecPooled(sizeof(UWORD) * NumColours,MEMF_ANY))
  209.                 {
  210.                     ColourTablex12(Table,Dest12,NumColours);
  211.  
  212.                     LoadRGB4(VPort,Dest12,NumColours);
  213.  
  214.                     FreeVecPooled(Dest12);
  215.                 }
  216.                 else
  217.                 {
  218.                     LONG i;
  219.  
  220.                     for(i = 0 ; i < Table -> NumColours ; i++)
  221.                         SetRGB4(VPort,i,Table -> Entry[i] . Red >> 28,Table -> Entry[i] . Green >> 28,Table -> Entry[i] . Blue >> 28);
  222.                 }
  223.             }
  224.         }
  225.     }
  226. }
  227.  
  228.     /* SetColour12(struct ViewPort *VPort,LONG Number,UWORD r,UWORD g,UWORD b):
  229.      *
  230.      *    Load a single colour entry in 12 bit colour precision.
  231.      */
  232.  
  233. VOID
  234. SetColour12(struct ViewPort *VPort,LONG Number,UWORD r,UWORD g,UWORD b)
  235. {
  236.     SetRGB4(VPort,Number,r,g,b);
  237. }
  238.  
  239.     /* SetColour96(struct ViewPort *VPort,ULONG Number,ULONG r,ULONG g,ULONG b):
  240.      *
  241.      *    Load a single colour entry in 96 bit colour precision.
  242.      */
  243.  
  244. VOID
  245. SetColour96(struct ViewPort *VPort,ULONG Number,ULONG r,ULONG g,ULONG b)
  246. {
  247.     if(GfxBase -> LibNode . lib_Version >= 39)
  248.         SetRGB32(VPort,Number,SPREAD(r),SPREAD(g),SPREAD(b));
  249.     else
  250.         SetRGB4(VPort,Number,r >> 28,g >> 28,b >> 28);
  251. }
  252.  
  253.     /* GrabColours(struct ViewPort *VPort,ColourTable *Table):
  254.      *
  255.      *    Copies the colour palette of the given viewport into the table.
  256.      */
  257.  
  258. VOID
  259. GrabColours(struct ViewPort *VPort,ColourTable *Table)
  260. {
  261.     if(GfxBase -> LibNode . lib_Version >= 39)
  262.     {
  263.         LONG i;
  264.  
  265.         for(i = 0 ; i < Table -> NumColours ; i++)
  266.             GetRGB32(VPort->ColorMap,i,1,(ULONG *)&Table -> Entry[i] . Red);
  267.     }
  268.     else
  269.     {
  270.         LONG    Value;
  271.         LONG    i;
  272.  
  273.         for(i = 0 ; i < Table -> NumColours ; i++)
  274.         {
  275.             Value = GetRGB4(VPort->ColorMap,i);
  276.  
  277.             Table -> Entry[i] . Red        = ((Value & 0xF00) >> 8) * 0x11111111;
  278.             Table -> Entry[i] . Green    = ((Value & 0x0F0) >> 4) * 0x11111111;
  279.             Table -> Entry[i] . Blue    =  (Value & 0x00F)       * 0x11111111;
  280.         }
  281.     }
  282. }
  283.  
  284.     /* CopyColours(const ColourTable *From,ColourTable *To):
  285.      *
  286.      *    Copy colours from one table to another.
  287.      */
  288.  
  289. VOID
  290. CopyColours(const ColourTable *From,ColourTable *To)
  291. {
  292.     LONG i,Min;
  293.  
  294.     Min = MIN(From->NumColours,To->NumColours);
  295.  
  296.     for(i = 0 ; i < Min ; i++)
  297.     {
  298.         To -> Entry[i] . Red    = From -> Entry[i] . Red;
  299.         To -> Entry[i] . Green    = From -> Entry[i] . Green;
  300.         To -> Entry[i] . Blue    = From -> Entry[i] . Blue;
  301.     }
  302. }
  303.